INSERT or UPDATE
Solutions for INSERT OR UPDATE on SQL Server
https://stackoverflow.com/questions/108403/solutions-for-insert-or-update-on-sql-server
1)
DECLARE @msg NVARCHAR(MAX) = 'L2'
BEGIN TRAN
IF EXISTS (
SELECT *
FROM DBO.LOG2ENTITY WITH (UPDLOCK, SERIALIZABLE)
WHERE ID = @key
)
BEGIN
UPDATE DBO.LOG2ENTITY
SET
Message = @msg
WHERE ID =@key
END
ELSE
BEGIN
INSERT INTO DBO.LOG2ENTITY (Message)
VALUES (@msg)
END
COMMIT TRAN
2) Идея-костыль:
2.1) Если строка отсутствует в таблице (EXSIST SELECT)
(Опционально возможен сразу UPDLOCK),
то пробуем выполнить вставку строки, в случае возникновения ошибки, что ключ уже существует, игнорируем ее.
(При этом возможно, что вместо большей части данных пока что подставляем значения по умолчанию, важен только ключ)
2.2) Явно начинаем транзакцию
2.2.1) Извлекаем строку с блокировкой (WITH UPDLOCK). К данному этапу строка уже гарантированно есть в БД (Если не рассматривать удаление).
2.2.2) При необходимости проверяем состояние строки. Обеспечивая идемпотентность и корректность с точки зрения многопоточности и версионности.
2.2.3) При необходимости обновляем строку.